return {
    enum("role", "角色", {
        "user",
        "admin 管理 员",
    }),
    enum("result", {
        "done",
        "failed 管理 员",
        "waive 管 理 员",
    }),
    entity("user", "用户", {
        field = {
            "seq         serial      登录令牌的序号",
            "username    text        用户名",
            "credential  text        加盐哈希过的密码",
            "role        role        角色（权限）",
            "name        text        姓名",
            "phone       text        手机号码或电话号码",
        },
        constraint = {
            "unique seq",
        },
        fn = {
            {
                _="管理员添加用户",
                mode = "post", name = "add", role="admin",
                args = { "username", "*password", "role", "name", "phone" },
                {
                    tag = "insert",
                    what = {
                        {"username"},
                        {"credential", "password"},
                        {"role"},
                        {"name"},
                        {"phone"},
                    }
                },
            },
            {
                _="游客注册",
                mode = "post", name = "register", role=nil,
                args = { "username", "*password", "name", "phone" },
                {
                    tag = "call",
                    name = "add",
                    args = {
                        "username",
                        "password",
                        "='user'",
                        "name",
                        "phone",
                    },
                },
            },
        --  {
        --      mode = "post", name = "add",
        --      role = { "admin" },
        --      args = { "username", "*password", "role", "name", "phone" },
        --      {
        --          tag = "insert",
        --          what = {
        --              {"username"},
        --              {"credential", "password"},
        --              {"role"},
        --              {"name"},
        --              {"phone"},
        --          },
        --      },
        --  },
        --  {
        --      mode = "get", name = "login", _="token中有blahblah",
        --      args = { "username", "*password" },
        --      rets = { "token" },
        --      {
        --          tag = "select",
        --          what = { "seq", "credential", "role", "name", "phone" },
        --          by = { "username" }
        --      },
        --      {
        --          tag = "java",
        --          what = [[
        --              if (!check_password(credential, password))
        --                  throw new failure("denied");
        --              String token = make_token(seq, role, name, phone);
        --          ]],
        --      },
        --  },
        --  {
        --      mode = "list", name = "list",
        --      role = { "admin" },
        --      {
        --          tag = "select",
        --          what = { "*" },
        --      },
        --  },
        --  {
        --      mode = "private", name = "from-seq",
        --      args = { "seq" },
        --      rets = { "user" },
        --      {
        --          tag = "select",
        --          what = { "user" },
        --          by = { "seq" },
        --      },
        --  },
        },
    }),
}

